home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / KEYWITCH / KW_S200.LZH / SXKeyW.s < prev    next >
Text File  |  1995-03-20  |  7KB  |  459 lines

  1.     .include    w01dos.mac
  2.     .include    w02iocs.mac
  3.     .include    w03const.mac
  4.     .include    KWCall.mac
  5.  
  6. ;SXコールマクロとコール番号
  7. SXCALL    .macro    num
  8.     .dc.w    num
  9.     .endm
  10.  
  11. __MMChHdlNew        equ    $A021
  12. __MMHdlDispose        equ    $A038
  13. __KBSimulate        equ    $A089
  14. __KBTini        equ    $A08E
  15. __KBCurKbrGet        equ    $A08F
  16. __GMSetGraph        equ    $A131
  17. __GMShadowStrZ        equ    $A1A1
  18. __DMOpen        equ    $A2C3
  19. __DMDispose        equ    $A2C6
  20. __DMControl        equ    $A2C7
  21. __DMBeep        equ    $A2D7
  22. __TSExit        equ    $A352
  23. __TSEventAvail        equ    $A357
  24. __TSGetTdb        equ    $A35B
  25. __TSGetID        equ    $A360
  26. __SXSearchFname        equ    $A3D4
  27. __SXGetDispRect        equ    $A432
  28.  
  29. ;ワークエリア
  30.     .offset    0
  31. oldKeyInt:    .ds.l    1
  32. oldKeyErr:    .ds.l    1
  33. oldKeyProc:    .ds.l    1
  34. eventRec:    .ds.b    18
  35. tdbPtr:        .ds.b    512
  36.     .even
  37.         .ds.b    8192
  38. workSize:
  39.  
  40. ;コモンエリア
  41.     .offset    0
  42. releaseFlag:    .ds.b    1
  43.     .even
  44. commonSize:
  45.  
  46. ;イベントマネージャのイベントレコード
  47.     .offset    0
  48. eWhat:        .ds.w    1
  49. eWith:        .ds.l    1
  50. eWhen:        .ds.l    1
  51. eWhere:        .ds.l    1
  52. eHow:        .ds.l    1
  53. event:
  54.  
  55. EM_EVERY    equ    $FFFF
  56.  
  57. ;タスクマネージャのイベントレコード
  58.     .offset    0
  59. tnWhat:        .ds.w    1
  60. tnWhom:        .ds.l    1
  61. tnWhen:        .ds.l    1
  62. tnWhom2:    .ds.l    1
  63. tnWhat2:    .ds.w    1
  64. tnTskid:    .ds.w    1
  65. tnEvent:
  66.  
  67. TS_ENDTSK    equ    1
  68. TS_CLOSEALL    equ    2
  69. TS_SAVE        equ    31
  70. TS_SELECT    equ    32
  71.  
  72. ;キーボードマネージャのキーボードレコード
  73.     .offset    0
  74.         .ds.w    1    ;1
  75. kbBufSiz:    .ds.w    1    ;バッファサイズ(1024まで)
  76. kbBuffer:    .ds.l    1    ;キーバッファの先頭
  77. kbReadPtr:    .ds.l    1    ;読み出し位置
  78. kbWritePtr:    .ds.l    1    ;書き込み位置
  79. kbShift:    .ds.l    1    ;シフトキービット
  80. kbLastKey:    .ds.w    1    ;割り込みで入力された生のキーデータ(上位バイトは無効)
  81. kbXf2Opt1:    .ds.b    1    ;[0]XF2でOPT.1をシミュレートする
  82. kbResetOn:    .ds.b    1    ;[1]キーボードのリセットに対応する
  83. kbOldOn:    .ds.b    1    ;[2]元のキー入力割り込みを使う
  84. kbLedOn:    .ds.b    1    ;[3]KBShiftSetでLEDCTRLする
  85. kbClickOn:    .ds.b    1    ;[4]クリックを鳴らす
  86. kbAssignOn:    .ds.b    1    ;[5]キーアサインテーブルを有効にする
  87. kbAutoRept:    .ds.b    1    ;[6]オートリピートする
  88. kbGetReset:    .ds.b    1    ;キーボードのリセットが発生した
  89.         .ds.b    1    ;BREAK
  90.         .ds.b    1    ;COPY
  91.         .ds.b    1    ;CTRL+C
  92.         .ds.b    1    ;CTRL+D
  93.         .ds.b    1    ;CTRL+N
  94.         .ds.b    1    ;CTRL+P
  95.         .ds.b    1    ;CTRL+Q
  96.         .ds.b    1    ;CTRL+S
  97.         .ds.b    10    ;(未使用)
  98. kbMap:        .ds.b    $80    ;キーの状態
  99. kbAssignMap:    .ds.b    $80    ;キーアサインテーブル
  100.  
  101.     .text
  102.  
  103. moduleHead:
  104.     .dc.l    'OBJR'
  105.     .dc.l    moduleTail-moduleHead
  106.     .dc.l    moduleEntry-moduleHead
  107.     .dc.l    workSize
  108.     .dc.l    commonSize
  109.     .dc.l    0,0,0
  110.  
  111. execEntry:
  112.     DOS    _EXIT
  113.  
  114.  
  115. ;キー入力エラー割り込みルーチン
  116. keyErr:
  117.     tst.b    UDR
  118.     rte
  119.  
  120. ;キー入力割り込みルーチン
  121. keyInt:
  122.     movem.l    d0-d2/a0-a1,-(sp)
  123.     moveq.l    #0,d2
  124.     move.b    UDR,d2            ;スキャンコード
  125.     SXCALL    __KBCurKbrGet
  126.     movea.l    d0,a1            ;キーボードレコードのアドレス
  127.     move.w    d2,kbLastKey(a1)
  128.     cmp.b    #$FE,d2
  129.     bcc    keyInt_init        ;初期化
  130.     tst.b    kbAssignOn(a1)
  131.     beq    keyIntNotAssign        ;キーアサインテーブルを使わない
  132.     lea.l    kbAssignMap(a1),a0
  133.     moveq.l    #$7F,d0
  134.     and.b    d2,d0
  135.     eor.b    d0,d2
  136.     or.b    (a0,d0.w),d2
  137. keyIntNotAssign:
  138.     KWCall    __KWSimulate        ;入力
  139.     tst.b    kbXf2Opt1(a1)
  140.     beq    keyIntEnd        ;XF2をOPT.1として使わない
  141.     add.b    d2,d2
  142.     cmp.b    #$56*2,d2        ;XF2か
  143.     bne    keyIntEnd        ;違う
  144.     move.b    #$72,d2            ;OPT.1にする
  145.     lsr.w    #1,d2
  146.     KWCall    __KWSimulate        ;入力
  147. keyIntEnd:
  148.     movem.l    (sp)+,d0-d2/a0-a1
  149.     rte
  150.  
  151. keyInt_init:
  152.     beq    keyInt_compact
  153. ;初期化
  154.     st.b    kbGetReset(a1)
  155.     tst.b    kbResetOn(a1)
  156.     beq    keyIntEnd
  157.     move.l    a1,-(sp)
  158.     SXCALL    __KBTini
  159.     addq.l    #4,sp
  160.     move.b    SR_LED,d1
  161.     IOCS    _KEY_INIT
  162.     bra    keyIntEnd
  163.  
  164. ;Compact
  165. keyInt_compact:
  166.     moveq.l    #1,d2
  167.     KWCall    __KWCompact
  168.     bra    keyIntEnd
  169.  
  170.  
  171. ;__KWKeyProcで差し換えるルーチン
  172. keySimulate:
  173.     move.l    d1,-(sp)
  174.     SXCALL    __KBCurKbrGet
  175.     move.l    d0,-(sp)
  176.     SXCALL    __KBSimulate
  177.     addq.l    #4,sp
  178.     move.l    (sp)+,d0
  179.     rts
  180.  
  181.  
  182. ;実行開始位置
  183. moduleEntry:
  184.     tst.w    d1
  185.     bne    moduleAbort        ;2回目は無視
  186.     movea.l    a1,a5
  187.     bsr    init
  188.     bmi    moduleAbort
  189. eventLoop:
  190.     pea.l    eventRec(a5)
  191.     move.w    #EM_EVERY,-(sp)
  192.     SXCALL    __TSEventAvail
  193.     addq.l    #6,sp
  194.     moveq.l    #$0F,d0
  195.     and.w    eventRec+tnWhat(a5),d0
  196.     add.w    d0,d0
  197.     move.w    eventTable(pc,d0.w),d0
  198.     jsr    eventTable(pc,d0.w)
  199.     bpl    eventLoop
  200.     bsr    tini
  201. moduleAbort:
  202.     clr.w    -(sp)
  203.     SXCALL    __TSExit
  204.  
  205. eventTable:
  206.     .dc.w    idle-eventTable
  207.     .dc.w    leftDown-eventTable
  208.     .dc.w    leftUp-eventTable
  209.     .dc.w    rightDown-eventTable
  210.     .dc.w    rightUp-eventTable
  211.     .dc.w    keyDown-eventTable
  212.     .dc.w    keyUp-eventTable
  213.     .dc.w    update-eventTable
  214.     .dc.w    reserv1-eventTable
  215.     .dc.w    activate-eventTable
  216.     .dc.w    reserv2-eventTable
  217.     .dc.w    reserv3-eventTable
  218.     .dc.w    system1-eventTable
  219.     .dc.w    system2-eventTable
  220.     .dc.w    user1-eventTable
  221.     .dc.w    user2-eventTable
  222.  
  223.  
  224. ;初期化
  225. init:
  226.     KWCall    __KWVersion
  227.     swap.w    d0
  228.     cmp.w    #'KW',d0
  229.     bne    keyWitchNotFound
  230.  
  231.     moveq.l    #1,d2
  232.     KWCall    __KWIntMode
  233.  
  234.     lea.l    keySimulate(pc),a1
  235.     KWCall    __KWKeyProc
  236.     move.l    d0,oldKeyProc(a5)
  237.  
  238.     pea.l    keyInt(pc)
  239.     move.w    #KEYINT,-(sp)
  240.     DOS    _INTVCS
  241.     move.l    d0,oldKeyInt(a5)
  242.     pea.l    keyErr(pc)
  243.     move.w    #KEYERR,-(sp)
  244.     DOS    _INTVCS
  245.     move.l    d0,oldKeyErr(a5)
  246.     lea.l    12(sp),sp
  247.  
  248. init_9:
  249.     moveq.l    #0,d0
  250.     rts
  251.  
  252. init_99:
  253.     moveq.l    #-1,d0
  254.     rts
  255.  
  256.  
  257. ;KeyWitch2が組み込まれていない
  258. keyWitchNotFound:
  259.     move.w    #2,-(sp)
  260.     SXCALL    __DMBeep
  261.     addq.l    #2,sp
  262.  
  263.     move.l    #itemListEnd-itemList,-(sp)
  264.     SXCALL    __MMChHdlNew
  265.     addq.l    #4,sp
  266.     movea.l    d0,a3
  267.     movea.l    (a3),a0
  268.     lea.l    itemList(pc),a1
  269.     move.w    #(itemListEnd-itemList)/2-1,d0
  270. copyItemList:
  271.     move.w    (a1)+,(a0)+
  272.     dbra    d0,copyItemList
  273.  
  274.     subq.l    #8,sp
  275.     move.l    sp,-(sp)
  276.     SXCALL    __SXGetDispRect
  277.     addq.l    #4,sp
  278.     movem.w    (sp)+,d0-d3
  279.     add.w    d2,d0
  280.     lsr.w    #1,d0
  281.     move.w    d0,d2
  282.     moveq.l    #180/2,d4
  283.     sub.w    d4,d0
  284.     add.w    d4,d2
  285.     add.w    d3,d1
  286.     lsr.w    #1,d1
  287.     move.w    d1,d3
  288.     moveq.l    #80/2,d4
  289.     sub.w    d4,d1
  290.     add.w    d4,d3
  291.  
  292.     movem.w    d0-d3,-(sp)
  293.     move.l    a3,-(sp)
  294.     SXCALL    __TSGetID
  295.     move.l    d0,-(sp)
  296.     clr.w    -(sp)
  297.     move.l    #-1,-(sp)
  298.     move.w    #$0260,-(sp)
  299.     move.w    #-1,-(sp)
  300.     clr.l    -(sp)
  301.     pea.l    22(sp)
  302.     clr.l    -(sp)
  303.     SXCALL    __DMOpen
  304.     lea.l    38(sp),sp
  305.     movea.l    a0,a4
  306.  
  307.     move.l    a4,-(sp)
  308.     SXCALL    __GMSetGraph
  309.     addq.l    #4,sp
  310.     lea.l    messageList(pc),a1
  311.     moveq.l    #0,d1
  312.     move.w    (a1)+,d1
  313. drawDialogLoop:
  314.     move.l    (a1),-(sp)
  315.     pea.l    4(a1)
  316.     SXCALL    __GMShadowStrZ
  317.     addq.l    #8,sp
  318.     adda.l    d1,a1
  319.     move.w    (a1)+,d1
  320.     bne    drawDialogLoop
  321.  
  322.     clr.l    -(sp)
  323.     SXCALL    __DMControl
  324.     move.l    a4,(sp)
  325.     SXCALL    __DMDispose
  326.     move.l    a3,(sp)
  327.     SXCALL    __MMHdlDispose
  328.     addq.l    #4,sp
  329.  
  330.     moveq.l    #-1,d0
  331.     rts
  332.  
  333.  
  334. ;ダイアログのアイテムリスト
  335. itemList:
  336.     .dc.w    1-1
  337. 1:    .dc.l    0
  338.     .dc.w    128,56,160,74
  339.     .dc.b    4,6,4,'確認'
  340.     .even
  341. itemListEnd:
  342.  
  343.  
  344. ;ダイアログに表示するメッセージ
  345. messageList:
  346.     .dc.w    2f-1f
  347. 1:    .dc.w    72,2
  348.     .dc.b    'SXKeyW',0
  349.     .even
  350. 2:    .dc.w    2f-1f
  351. 1:    .dc.w    12,24
  352.     .dc.b    'KeyWitch version 2.00 以降',0
  353.     .even
  354. 2:    .dc.w    2f-1f
  355. 1:    .dc.w    12,40
  356.     .dc.b    'が組み込まれていません',0
  357.     .even
  358. 2:    .dc.w    0
  359.  
  360.  
  361. ;終了処理
  362. tini:
  363.     move.l    oldKeyInt(a5),-(sp)
  364.     move.w    #KEYINT,-(sp)
  365.     DOS    _INTVCS
  366.     move.l    oldKeyErr(a5),-(sp)
  367.     move.w    #KEYERR,-(sp)
  368.     DOS    _INTVCS
  369.     lea.l    12(sp),sp
  370.  
  371.     movea.l    oldKeyProc(a5),a1
  372.     KWCall    __KWKeyProc
  373.  
  374.     suba.l    a1,a1
  375.     KWCall    __KWSetTask
  376.  
  377.     moveq.l    #0,d2
  378.     KWCall    __KWIntMode
  379.  
  380.     moveq.l    #0,d0
  381.     rts
  382.  
  383.  
  384. ;アクティベイトイベント
  385. activate:
  386.     move.l    eventRec+tnWhom(a5),d0
  387.     beq    activate_9
  388.  
  389.     movea.l    d0,a0
  390.     move.w    $6E+2(a0),-(sp)
  391.     pea.l    tdbPtr(a5)
  392.     SXCALL    __TSGetTdb
  393.     addq.l    #6,sp
  394.  
  395.     pea.l    tdbPtr(a5)
  396.     SXCALL    __SXSearchFname
  397.     addq.l    #4,sp
  398.     movea.l    a0,a1
  399.     KWCall    __KWSetTask
  400.  
  401. activate_9:
  402.     moveq.l    #0,d0
  403.     rts
  404.  
  405.  
  406. ;タスクマネージャイベント
  407. system1:
  408. system2:
  409.     move.w    eventRec+tnWhat2(a5),d0
  410.     cmp.w    #TS_ENDTSK,d0
  411.     beq    endTask
  412.     cmp.w    #TS_CLOSEALL,d0
  413.     beq    closeAll
  414. system_9:
  415.     moveq.l    #0,d0
  416.     rts
  417.  
  418. endTask:
  419. closeAll:
  420. system_99:
  421.     moveq.l    #-1,d0
  422.     rts
  423.  
  424.  
  425. ;アイドルイベント
  426. idle:
  427.     tst.b    releaseFlag(a4)
  428.     bne    release
  429.  
  430.     moveq.l    #0,d0
  431.     rts
  432.  
  433. release:
  434.     moveq.l    #-1,d0
  435.     rts
  436.  
  437.  
  438. leftDown:
  439. leftUp:
  440. rightDown:
  441. rightUp:
  442. keyDown:
  443. keyUp:
  444. update:
  445. reserv1:
  446. reserv2:
  447. reserv3:
  448. user1:
  449. user2:
  450.     moveq.l    #0,d0
  451.     rts
  452.  
  453.  
  454.     .even
  455.  
  456. moduleTail:
  457.  
  458.     .end    execEntry
  459.